跳到主要内容

13 UART实验

up的视频讲解

把字节、字符与串口波形联系起来,完成字符串发送和中断接收。

up视频里的实验代码: 👣串口实验代码

CH340驱动: 🔧CH340串口驱动安装

🔤串口重定向函数
#include <stdio.h>
// printf输出重定向
int fputc(int ch, FILE *f)
{
uint8_t temp = ch;
HAL_UART_Transmit(&huart1, &temp, 1, HAL_MAX_DELAY);
return ch;
}

// scanf / getchar 输入重定向
int fgetc(FILE *f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1, &ch, 1, HAL_MAX_DELAY);
return ch;
}

✉️ UART通信实验原理​

STM32 使用 UART,电脑端通过 USB 接入,两者由 CH340 桥接。线路传输的是字节,串口助手再按选择的显示方式解释它们。

主控、CH340 与电脑组成完整的数据通路。
主控、CH340 与电脑组成完整的数据通路。

按 ASCII 解释时,十进制 65 表示字符 A,54 表示字符 6。打印字符能够直接显示;回车、换行等控制字符则影响显示位置。

1 💻串口数组/指针发送实验​

1.1 实验连接​

PA9 接 CH340 的 RXD,双方 GND 相连;接收实验还需要 TXD 接 PA10。

PA9 接 CH340 的 RXD,双方 GND 相连;接收实验还需要 TXD 接 PA10。
PA9 接 CH340 的 RXD,双方 GND 相连;接收实验还需要 TXD 接 PA10。

1.2 实验原理​

一个字符对应一个编码值,一串字符则需要连续的存储空间。数组保存字符本身,指针保存地址,两者不能当作同一种对象理解。

对照字符数组与指针,观察“数据”与“数据地址”的区别。
对照字符数组与指针,观察“数据”与“数据地址”的区别。

字符串 Hello 有五个可见字符,C 字符串末尾还需要结束符 \0。发送长度应结合具体存储方式理解,因此代码分别使用 sizeof 和 strlen。

发送函数读取给定地址上的字节,再交给串口外设。
发送函数读取给定地址上的字节,再交给串口外设。

变量转换成可读文本时,格式字符串分成普通文字、格式占位与转义序列。例如 %d 表示相应整数的格式,\r\n 表示回车和换行。

先找到固定文本,再找到需要由变量值填入的位置。
先找到固定文本,再找到需要由变量值填入的位置。

printf() 输出格式化文本,需要通过串口重定向连接到 UART;sprintf() 则把格式化结果写入指定缓冲区。缓冲区中存放的是字符,不是把原数值的二进制表示直接发送出去。

1.3 CubeMX配置​

USART1选择Asynchronous,参数默认就好

CubeMX配置

1.4 实验代码​

全局​

#include <stdio.h>

main()​

char p1[] = "Hello";
char* p2 = "world\r\n";

while(1)里面​

HAL_UART_Transmit(&huart1,p1,sizeof(p1)-1,1000);
HAL_UART_Transmit(&huart1,p2,strlen(p2),1000);
printf("Hello World\r\n");
HAL_Delay(50);

2 📨串口中断接收实验​

2.1 实验连接​

在发送实验接线基础上补接CH340 TXD到PA10;PA9接CH340 RXD,GND共地。

2.2 实验原理​

先启动一个字节的中断接收。接收完成后,HAL 调用回调函数,程序重新开启下一次接收;主循环读取 rx,决定是否执行相应动作。

程序用字符 '1' 作为判断条件。串口助手应以字符方式发送它,让接收数据与代码中的字符比较对应起来。

2.3 CubeMX配置​

配置UART时已包含发送

2.4 实验代码​

全局​

#include <stdio.h>

char rx = 0;

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Receive_IT(&huart1,&rx,1);
}

main()​

HAL_UART_Receive_IT(&huart1,&rx,1);

while(1)里面​

if(rx == '1')
{
printf("Hello World\r\n");
}